package com.dhj.jvmstudy.chapter02;

import sun.misc.Launcher;
import sun.security.ec.CurveDB;

import java.net.URL;
import java.net.URLClassLoader;
import java.security.Provider;

/**
 * 不同类加载器的加载路径
 */
public class ClassLoaderTest1 {

    public static void main(String[] args) {
        System.out.println("---------- 启动类加载器（Bootstrap ClassLoader） ----------");
        // 获取Bootstrap ClassLoader能够加载的api路径
        URL[] urLs = Launcher.getBootstrapClassPath().getURLs();
        for(URL ele : urLs){
            System.out.println(ele.toExternalForm());
        }
        // 从上面的urls中的路径随机选择一个类，来看看它的类加载器是什么。
        // 结果为null， 说明是确实是引导类加载器
        ClassLoader classLoader = Provider.class.getClassLoader();
        System.out.println(classLoader); // null


        System.out.println("---------- 扩展类加载器（Ext ClassLoader） ----------");
        String extDirs = System.getProperty("java.ext.dirs");
        for (String dir : extDirs.split(";")){
            System.out.println(dir);
        }
        // 从上面的extDirs中的路径随机选择一个类，来看看它的类加载器是什么。
        // 结果为ExtClassLoader， 说明是确实是引导类加载器
        ClassLoader classLoader1 = CurveDB.class.getClassLoader();
        System.out.println(classLoader1); // sun.misc.Launcher$ExtClassLoader@404b9385

        System.out.println("---------- 系统类加载器（App ClassLoader） ----------");
        URLClassLoader appClassLoader = (URLClassLoader)ClassLoader.getSystemClassLoader();
        for(URL url : appClassLoader.getURLs()){
            System.out.println(url);
        }

    }

}
